package com.mihong.handler;

import com.mihong.entity.Frame;
import com.mihong.entity.Message;
import com.mihong.entity.ServerConfig;
import com.mihong.util.CRC16Util;
import com.mihong.util.HexUtil;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import redis.clients.jedis.Jedis;

/**
 * 	应答网关帧
 * @date: 2019年3月4日
 */
public class ReplayHandler {


	private StringBuilder frameStr = new StringBuilder();
	
	/**
	 * 	注册包数据应答
	 * @param frame
	 * @param success
	 * @return
	 */
	public byte[] registerHandler(Frame frame,Boolean success) {
		
		//拼接数据帧
		frameStr.append(frame.getVersion()+frame.getFrameNo()+frame.getAddress()+frame.getCommand());
		frameStr.append(Message.REGISTER_DATA_LENGTH);//数据长度
		if(success) {
			frameStr.append(Message.SUCCESS+ServerConfig.HEART_PERIOD+ServerConfig.TERMINAL_STATUS_PERIOD);
		}else {
			frameStr.append(Message.FAILURE+ServerConfig.HEART_PERIOD+ServerConfig.TERMINAL_STATUS_PERIOD);
		}
		byte[] hexString = HexUtil.hexStringToBytes(frameStr.toString());
		String crc = CRC16Util.CRC16_ccitt(hexString);
		frameStr.append(crc+Message.FRAME_END);
		frameStr.insert(0, Message.FRAME_HEAD);
		return HexUtil.hexStringToBytes(frameStr.toString());
	}
	
	/**
	 * 	心跳包数据应答
	 * @param frame
	 * @param success
	 * @return
	 */
	public byte[] heartBeatHandler(Frame frame,Boolean success) {
		//拼接数据帧
		frameStr.append(frame.getVersion()+frame.getFrameNo()+frame.getAddress()+frame.getCommand());
		frameStr.append(Message.HEART_DATA_LENGTH);//数据长度
		if(success) {
			frameStr.append(Message.SUCCESS);
		}else {
			frameStr.append(Message.FAILURE);
		}
		byte[] hexString = HexUtil.hexStringToBytes(frameStr.toString());
		String crc = CRC16Util.CRC16_ccitt(hexString);
		frameStr.append(crc+Message.FRAME_END);
		frameStr.insert(0, Message.FRAME_HEAD);
		return HexUtil.hexStringToBytes(frameStr.toString());
	}
	
	/**
	 * 	状态包数据应答
	 * @param frame
	 * @param success
	 * @return
	 */
	public byte[] statusHandler(Frame frame,Boolean success) {
		//拼接数据帧
		frameStr.append(frame.getVersion()+frame.getFrameNo()+frame.getAddress()+frame.getCommand());
		frameStr.append(Message.STATUS_DATA_LENGTH);//数据长度
		if(success) {
			frameStr.append(Message.SUCCESS);
		}else {
			frameStr.append(Message.FAILURE);
		}
		byte[] hexString = HexUtil.hexStringToBytes(frameStr.toString());
		String crc = CRC16Util.CRC16_ccitt(hexString);
		frameStr.append(crc+Message.FRAME_END);
		frameStr.insert(0, Message.FRAME_HEAD);
		return HexUtil.hexStringToBytes(frameStr.toString());

	}
	
	/**
	 * 	网关设备列表包数据应答
	 * @param success
	 * @return
	 */
	public byte[] equipmentListHandler(Frame frame,String equimentsMAC) {

		//拼接数据帧
		frameStr.append(frame.getVersion()+frame.getFrameNo()+frame.getAddress()+Message.COMMAND_EQUIPMENT_LIST);
		//数据长度=6*终端设备个数
		int dataLength1 = equimentsMAC.length()/Message.LENGTH_STRING_HEX;
//		int num = dataLength1/Message.BYTE_MAC;
		
		String dataLength = Integer.toHexString(dataLength1).toUpperCase();
		if(dataLength.length()<3) {//数据长度2个字节 00 1E
			dataLength = "00" + dataLength;
		}
		if((dataLength.length() % 2) != 0) {//jdk转换若长度为奇数，生成crc校验码会出错
			dataLength = "0" +dataLength;
		}
		frameStr.append(dataLength);
		frameStr.append(equimentsMAC);
		
		byte[] hexString = HexUtil.hexStringToBytes(frameStr.toString());
		String crc = CRC16Util.CRC16_ccitt(hexString);
		
		frameStr.append(crc+Message.FRAME_END);
		
		frameStr.insert(0, Message.FRAME_HEAD);
		return HexUtil.hexStringToBytes(frameStr.toString());
		
	}	
//	//拼接数据帧
//	frameStr.append(frame.getVersion()+frame.getFrameNo()+frame.getAddress()+frame.getCommand());
//	frameStr.append(Message.EQUIPMENT_DATA_LENGTH);//数据长度
//	if(success) {
//		frameStr.append(Message.SUCCESS);
//	}else {
//		frameStr.append(Message.FAILURE);
//	}
//	byte[] hexString = HexUtil.hexStringToBytes(frameStr.toString());
//	String crc = CRC16Util.CRC16_ccitt(hexString);
//	frameStr.append(crc+Message.FRAME_END);
//	frameStr.insert(0, Message.FRAME_HEAD);
//	return HexUtil.hexStringToBytes(frameStr.toString());
	
	/**
	 * 	ip切换包数据应答
	 * @param success
	 * @return
	 */
	public byte[] ipSwitchingHandler(Frame frame) {
		
		//拼接数据帧
		frameStr.append(frame.getVersion()+frame.getFrameNo()+frame.getAddress()+Message.COMMAND_IP_SWITCHING);
		frameStr.append(Message.IP_SWITCHING_DATA_LENGTH);//数据长度
		
		frameStr.append(ipToHexString(ServerConfig.ip, ServerConfig.port));
		
		byte[] hexString = HexUtil.hexStringToBytes(frameStr.toString());
		String crc = CRC16Util.CRC16_ccitt(hexString);
		frameStr.append(crc+Message.FRAME_END);
		frameStr.insert(0, Message.FRAME_HEAD);
		
		return HexUtil.hexStringToBytes(frameStr.toString());
	}
	
	/**
	 * 	ip端口转为16进制字符串
	 * @param ip
	 * @param port
	 * @return
	 */
	private String ipToHexString(String ip,int port) {
	
		StringBuilder sBuilder = new StringBuilder();
		
		String[] split = ip.split("\\.");
		for(String str : split) {
			sBuilder.append(Integer.toHexString(Integer.parseInt(str)).toUpperCase());
		}
		
		sBuilder.append(Integer.toHexString(port).toUpperCase());
		return sBuilder.toString();
	}
	
}
